// 导入express 模块
const express = require("express");
const session = require("express-session");
const MongoStore = require("connect-mongo")(session);

/*
    session保存到数据库里面
    1. 配置express-session中间件

    2. 安装connect-mongo模块
       npm install connect-mongo --save

    3. 在app.js中引入connect-mongo模块
       const MongoStore = require("connect-mongo")(session);

    4. 在session中间件中配置store属性，指定使用MongoDB存储session
    app.use(session({
        secret: "my_secret", // 用于加密session的字符串
        resave: false, // 强制保存session，即使它没有被修改
        saveUninitialized: false, // 强制保存未初始化的session
        cookie: {
          maxAge: 1000 * 60 * 60 * 24, // 设置cookie的过期时间为1天
          secure: false, // 如果是HTTPS协议，设置为true
          httpOnly: true // 设置为true，客户端无法通过JavaScript访问cookie
        },
        rolling: true, // 在每次请求时强行设置cookie，重置cookie过期时间（默认：false）
        store: new MongoStore({
            url: "mongodb://127.0.0.1:27017/express_session", // MongoDB连接字符串
            collection: "sessions", // 存储session的集合名称
            touchAfter: 24 * 60 * 60, // 每24小时更新一次session的过期时间
            // autoRemove: "native", // 自动删除过期的session，使用原生MongoDB的删除方式
            ttl: 24 * 60 * 60 // 设置session的过期时间为1天
        }) // 使用MongoDB存储session
    }));
*/

// 创建express的服务器实例
const app = express();

// 配置session中间件
app.use(session({
    secret: "my_secret", // 用于加密session的字符串
    resave: false, // 强制保存session，即使它没有被修改
    saveUninitialized: false, // 强制保存未初始化的session
    cookie: {
      maxAge: 1000 * 60 * 60 * 24, // 设置cookie的过期时间为1天
      secure: false, // 如果是HTTPS协议，设置为true
      httpOnly: true // 设置为true，客户端无法通过JavaScript访问cookie
    },
    rolling: true, // 在每次请求时强行设置cookie，重置cookie过期时间（默认：false）
    // 使用MongoDB存储session
    store: new MongoStore({
        url: "mongodb://127.0.0.1:27017/express_session", // MongoDB连接字符串
        collection: "sessions", // 存储session的集合名称
        touchAfter: 24 * 60 * 60, // 每24小时更新一次session的过期时间
        // autoRemove: "native", // 自动删除过期的session，使用原生MongoDB的删除方式
        ttl: 24 * 60 * 60 // 设置session的过期时间为1天
    })
}));

app.get("/", (req, res) => {
    // 访问首页时，检查session中是否有username
    if (req.session.username) {
        // 如果有，说明用户已登录
        return res.send(`欢迎回来，${req.session.username}`);
    }
    // 如果没有，说明用户未登录
    res.send("用户未登录");
});

app.get("/login", (req, res) => {
    // 模拟登录操作，设置session数据
    req.session.username = "zhangsan"; // 设置session中的username
    res.send("登录成功");
});

app.get("/logout", (req, res) => {
    // 1. 设置session的过期时间为0，清除session数据（它会把所有的session都销毁）
    // req.session.cookie.maxAge = 0; // 设置cookie的过期时间为0，清除cookie
    // res.send("登出成功");

    // 2. 指定session的值为null，清除session数据
    // req.session.username = null; // 设置session中的username为null，清除session数据
    // res.send("登出成功");

    // 3. 或者直接调用req.session.destroy方法清除session数据
    // 模拟登出操作，清除session数据
    req.session.destroy(err => {
        if (err) {
            return res.send("登出失败");
        }
        res.send("登出成功");
    });
});

// 调用app.listen方法，指定端口号并启动web服务器
app.listen(80, function() {
  console.log(`Express server running at http://127.0.0.1`);
});